home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 17 / AMIGAplus Sonderheft 17 (1999)(ICP)(DE)[!].iso / mui / developer / extclasses / mcc_tron / source / tron.c < prev    next >
C/C++ Source or Header  |  1977-12-31  |  7KB  |  329 lines

  1. /*
  2.  
  3.         Tron.mcc (c) Copyright 1995-96 by kmel, Klaus Melchior
  4.  
  5.         Registered MUI class, Serial Number: 0002
  6.  
  7.         tron.c
  8.  
  9. */
  10.  
  11.  
  12.  
  13.  
  14. /* SMAKE */
  15.  
  16. /*** includes ***/
  17.  
  18. #ifdef __KMEL
  19.     #include <kmel/kmel.h>
  20.     #include <kmel/kmel_debug.h>
  21.  
  22.     #include <mui/tron_mcc.h>
  23. #else
  24.     #include <clib/alib_protos.h>
  25.     #include <clib/graphics_protos.h>
  26.     #include <clib/utility_protos.h>
  27.     #include <clib/muimaster_protos.h>
  28.     #include <pragmas/muimaster_pragmas.h>
  29.     #include <libraries/mui.h>
  30.  
  31.     #if MUIMASTER_VLATEST <= 14
  32.         #include "mui/mui33_mcc.h"
  33.     #endif
  34.  
  35.     #include "mui/tron_mcc_private.h"
  36.  
  37.     #define DB / ## /
  38. #endif
  39.  
  40.  
  41. #define D / ## /
  42.  
  43.  
  44. #define CLASS       MUIC_Tron
  45. #define SUPERCLASS  MUIC_Area
  46.  
  47. struct Data
  48. {
  49.     LONG  Pen1;
  50.     LONG  Pen2;
  51.     LONG  PenB;
  52.     LONG  Speed;
  53.  
  54.     struct MUI_RenderInfo *mri;
  55.     BOOL refresh;
  56. };
  57.  
  58. #include "rev/Tron.mcc.rev"
  59.  
  60. #define UserLibID "$VER: " __VERS " (" __DATE ") " __VERSCR
  61. #define VERSION __VERSION
  62. #define REVISION __REVISION
  63. #define MASTERVERSION 14
  64.  
  65. #include "mui/mccheader.c"
  66.  
  67.  
  68. /*** subs ***/
  69.  
  70. void release_pen(struct MUI_RenderInfo *mri, LONG *pen)
  71. {
  72.     if(*pen != -1)
  73.     {
  74.         MUI_ReleasePen(mri, *pen);
  75.         *pen = -1;
  76.     }
  77. }
  78.  
  79. void obtain_pen(struct MUI_RenderInfo *mri, LONG *pen, struct MUI_PenSpec *ps)
  80. {
  81.     release_pen(mri, pen);
  82.     *pen = MUI_ObtainPen(mri, ps, 0);
  83. }
  84.  
  85.  
  86. void RedrawAll(Object *obj, struct Data *data)
  87. {
  88.     DB("RedrawAll\n");
  89.  
  90.     SetAPen(_rp(obj), MUIPEN(data->PenB));
  91.     RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj), _mbottom(obj));
  92.  
  93.     SetAPen(_rp(obj), MUIPEN(data->Pen1));
  94.     RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mleft(obj) + data->Speed, _mbottom(obj));
  95.  
  96.     SetAPen(_rp(obj), MUIPEN(data->Pen2));
  97.     RectFill(_rp(obj), _mright(obj) - data->Speed, _mtop(obj), _mright(obj), _mbottom(obj));
  98.  
  99. }
  100.  
  101.  
  102.  
  103. ULONG ASM _New(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  104. {
  105.     struct Data *data;
  106.  
  107.     if (!(obj = (Object *)DoSuperMethodA(cl, obj, msg)))
  108.         return(0);
  109.  
  110.     /*** init data ***/
  111.     data = INST_DATA(cl, obj);
  112.  
  113.     data->Pen1    = -1;
  114.     data->Pen2    = -1;
  115.     data->PenB    = -1;
  116.     data->Speed   = DEFAULT_SPEED;
  117.  
  118.     data->mri     = NULL;
  119.     data->refresh = FALSE;
  120.  
  121.     /*** trick to set arguments ***/
  122.     msg->MethodID = OM_SET;
  123.     DoMethodA(obj, (Msg)msg);
  124.     msg->MethodID = OM_NEW;
  125.  
  126.     return((ULONG)obj);
  127. }
  128.  
  129.  
  130.  
  131. ULONG ASM _Dispose(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  132. {
  133.     return(DoSuperMethodA(cl,obj,msg));
  134. }
  135.  
  136.  
  137.  
  138. ULONG ASM _Set(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  139. {
  140.     struct Data *data = INST_DATA(cl, obj);
  141.     struct TagItem *tags,*tag;
  142.  
  143.     for(tags=((struct opSet *)msg)->ops_AttrList; tag=NextTagItem(&tags); )
  144.     {
  145.         switch(tag->ti_Tag)
  146.         {
  147.             case MUIA_Tron_Speed:
  148.                 DB("SET MUIA_Tron_Speed; %ld\n", tag->ti_Data);
  149.                 if(data->Speed != tag->ti_Data)
  150.                 {
  151.                     data->Speed = tag->ti_Data;
  152.                     data->refresh = TRUE;
  153.                 }
  154.             break;
  155.  
  156.             case MUIA_Tron_PenSpec1:
  157.                 if(data->mri)
  158.                 {
  159.                     obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)tag->ti_Data);
  160.                     data->refresh = TRUE;
  161.                 }
  162.             break;
  163.  
  164.             case MUIA_Tron_PenSpec2:
  165.                 if(data->mri)
  166.                 {
  167.                     obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)tag->ti_Data);
  168.                     data->refresh = TRUE;
  169.                 }
  170.             break;
  171.  
  172.             case MUIA_Tron_PenSpecB:
  173.                 if(data->mri)
  174.                 {
  175.                     obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)tag->ti_Data);
  176.                     data->refresh = TRUE;
  177.                 }
  178.             break;
  179.  
  180.         }
  181.     }
  182.  
  183.     if(data->refresh)
  184.     {
  185.         if(data->mri)
  186.             RedrawAll(obj, data);
  187.  
  188.         data->refresh = FALSE;
  189.     }
  190.  
  191.     return(DoSuperMethodA(cl, obj, msg));
  192. }
  193.  
  194.  
  195. static ULONG ASM _Get(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  196. {
  197. //    struct Data *data = INST_DATA(cl, obj);
  198. //    ULONG *store = ((struct opGet *)msg)->opg_Storage;
  199.  
  200. //    switch( ((struct opGet *)msg)->opg_AttrID )
  201.     {
  202.     }
  203.  
  204.     return(DoSuperMethodA(cl, obj, msg));
  205. }
  206.  
  207.  
  208. static ULONG ASM _Setup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Setup *msg)
  209. {
  210.     struct Data *data = INST_DATA(cl, obj);
  211.     ULONG l;
  212.  
  213.     if(!(DoSuperMethodA(cl,obj,(Msg)msg)))
  214.         return(FALSE);
  215.  
  216.     data->mri = msg->RenderInfo;
  217.  
  218.     DB("Setup\n");
  219.  
  220.     /*** get pen 1 ***/
  221.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen1, &l))
  222.     {
  223.         obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)l);
  224.     }
  225.     else
  226.         obtain_pen(data->mri, &data->Pen1, (struct MUI_PenSpec *)DEFAULT_PEN1);
  227.     DB("Obtain Pen1: %ld\n", MUIPEN(data->Pen1));
  228.  
  229.     /*** get pen 2 ***/
  230.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Pen2, &l))
  231.     {
  232.         obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)l);
  233.     }
  234.     else
  235.         obtain_pen(data->mri, &data->Pen2, (struct MUI_PenSpec *)DEFAULT_PEN2);
  236.     DB("Obtain Pen2: %ld\n", MUIPEN(data->Pen2));
  237.  
  238.     /*** get pen B ***/
  239.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_PenB, &l))
  240.     {
  241.         obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)l);
  242.     }
  243.     else
  244.         obtain_pen(data->mri, &data->PenB, (struct MUI_PenSpec *)DEFAULT_PENB);
  245.     DB("Obtain PenB: %ld\n", MUIPEN(data->PenB));
  246.  
  247.  
  248.     /*** get speed ***/
  249.     if(DoMethod(obj, MUIM_GetConfigItem, MUICFG_Tron_Speed, &l))
  250.     {
  251.         data->Speed = *(ULONG *)l;
  252.     }
  253.     else
  254.         data->Speed = DEFAULT_SPEED;
  255.     DB("Speed: %ld\n", data->Speed);
  256.  
  257.     return(TRUE);
  258. }
  259.  
  260.  
  261. static ULONG ASM _Cleanup(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  262. {
  263.     struct Data *data = INST_DATA(cl, obj);
  264.  
  265.     release_pen(data->mri, &data->Pen1);
  266.     release_pen(data->mri, &data->Pen2);
  267.     release_pen(data->mri, &data->PenB);
  268.  
  269.     data->mri = NULL;
  270.  
  271.     return(DoSuperMethodA(cl,obj,msg));
  272. }
  273.  
  274.  
  275. ULONG ASM _AskMinMax(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_AskMinMax *msg)
  276. {
  277.     DoSuperMethodA(cl, obj, (Msg)msg);
  278.  
  279.     msg->MinMaxInfo->MinWidth  += 20;
  280.     msg->MinMaxInfo->DefWidth  += 50;
  281.     msg->MinMaxInfo->MaxWidth  += MUI_MAXMAX;
  282.  
  283.     msg->MinMaxInfo->MinHeight += 20;
  284.     msg->MinMaxInfo->DefHeight += 50;
  285.     msg->MinMaxInfo->MaxHeight += MUI_MAXMAX;
  286.  
  287.     return(0);
  288. }
  289.  
  290. ULONG ASM _Draw(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) struct MUIP_Draw *msg)
  291. {
  292.     struct Data *data = INST_DATA(cl, obj);
  293.  
  294.     /*** first draw the superclass ***/
  295.     DoSuperMethodA(cl, obj, (Msg)msg);
  296.  
  297.     DB("_Draw\n");
  298.  
  299.     /*** move the Tron line ***/
  300.     if(msg->flags & MADF_DRAWUPDATE)
  301.     {
  302.     }
  303.     else if(msg->flags & MADF_DRAWOBJECT)
  304.     {
  305.         RedrawAll(obj, data);
  306.     }
  307.  
  308.     return(0);
  309. }
  310.  
  311.  
  312. ULONG ASM SAVEDS _Dispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg)
  313. {
  314.     switch(msg->MethodID)
  315.     {
  316.         case OM_NEW        : return(_New      (cl,obj,(APTR)msg));
  317.         case OM_DISPOSE    : return(_Dispose  (cl,obj,(APTR)msg));
  318.         case OM_SET        : return(_Set      (cl,obj,(APTR)msg));
  319.         case OM_GET        : return(_Get      (cl,obj,(APTR)msg));
  320.         case MUIM_Setup    : return(_Setup    (cl,obj,(APTR)msg));
  321.         case MUIM_Cleanup  : return(_Cleanup  (cl,obj,(APTR)msg));
  322.         case MUIM_AskMinMax: return(_AskMinMax(cl,obj,(APTR)msg));
  323.         case MUIM_Draw     : return(_Draw     (cl,obj,(APTR)msg));
  324.     }
  325.  
  326.     return(DoSuperMethodA(cl,obj,msg));
  327. }
  328.  
  329.